package user

import (
	"gin-project-01/gin-step04/gin14-gorm-base/controllers"
	myModel "gin-project-01/gin-step04/gin14-gorm-base/models"
	"github.com/gin-gonic/gin"
	"math/rand"
	"net/http"
	"strconv"
	"time"
)

type UserController struct {
	controllers.BaseController //继承 controllers.BaseController
}

// List 参考文档：https://gorm.io/zh_CN/docs/query.html &  https://gorm.io/zh_CN/docs/advanced_query.html
//
//	@Description: 获取用户列表
//	@receiver u
//	@param c
func (u UserController) List(c *gin.Context) {
	var userList []myModel.User

	//查询所有
	myModel.Db.Find(&userList)
	c.JSON(http.StatusOK, myModel.Success("", userList))

	//查询age >20 方式一
	//myModel.Db.Where("age > ?", 20).Find(&userList)
	//c.JSON(http.StatusOK, myModel.Success("", userList))
	//
	////查询age >20 方式二
	//myModel.Db.Where("age > 20").Find(&userList)
	//c.JSON(http.StatusOK, myModel.Success("查询成功", userList))
}

// Add 参考文档：https://gorm.io/zh_CN/docs/create.html
//
//	@Description: 增加 Create
//
// http://localhost:8888/user/add?id=18
//
//	@receiver u
//	@param c
func (u UserController) Add(c *gin.Context) {
	user := myModel.User{
		AddTime:  int(time.Now().Unix()),
		Age:      rand.Intn(20) + 10,
		Email:    myModel.GenerateRandomString(8) + "@qq.com",
		Username: "tom" + strconv.Itoa(rand.Intn(100)),
	}
	myModel.Db.Create(&user)
	c.JSON(http.StatusOK, myModel.Success("添加成功", user))
}

// Detail 参考文档：https://gorm.io/zh_CN/docs/query.html &  https://gorm.io/zh_CN/docs/advanced_query.html
//
//	@Description: 查询 Find
//
// http://localhost:8888/user/get?id=18
//
//	@receiver u
//	@param c
func (u UserController) Detail(c *gin.Context) {
	idStr := c.Query("id")
	id, _ := strconv.Atoi(idStr)
	var user myModel.User

	myModel.Db.Where("id = ?", id).Find(&user)
	c.JSON(http.StatusOK, myModel.Success("查询成功", user))

	//user = models.User{Id: id}
	//models.Db.Find(&user)
	//c.JSON(http.StatusOK, models.Success("", user))
}

// Delete 删除用户 Delete  参考文档 ：https://gorm.io/zh_CN/docs/delete.html
// http://localhost:8888/user/del?id=18
//
//	@Description:
//	@receiver u
//	@param c
func (u UserController) Delete(c *gin.Context) {
	idStr := c.Query("id")
	id, _ := strconv.Atoi(idStr)
	var user myModel.User
	myModel.Db.Where("id = ?", id).Find(&user)
	if user.Id == 0 {
		c.JSON(http.StatusOK, myModel.Fail("用户不存在"))
	} else {
		myModel.Db.Delete(&user)
		c.JSON(http.StatusOK, myModel.Success("删除成功", nil))
	}
}

// Edit 参考文档：https://gorm.io/zh_CN/docs/update.html
//
//	@Description:  保存所有字段 Save
//	 http://localhost:8888/user/edit?id=19&username=tom199&age=18&email=12345@qq.com
//
// Save 是一个组合函数。 如果保存值不包含主键，它将执行 Create，否则它将执行 Update (包含所有字段)。
//
//	@receiver u
//	@param c
func (u UserController) Edit(c *gin.Context) {
	param := myModel.User{}
	err := c.ShouldBind(&param) //[结构体必须使用 `form:"xxx"`]
	if err != nil {
		c.JSON(http.StatusOK, myModel.Fail("参数错误"))
		return
	}
	id := param.Id
	//查询
	var user myModel.User
	myModel.Db.Where("id = ?", id).Find(&user)
	if user.Id == 0 {
		c.JSON(http.StatusOK, myModel.Fail("用户不存在"))
		return
	}
	user.Username = param.Username
	user.Email = param.Email
	user.Age = param.Age
	user.AddTime = int(time.Now().Unix())
	myModel.Db.Save(&user) //保存所有的字段
	c.JSON(http.StatusOK, myModel.Success("修改成功", nil))
}

// Edit01
//
//	@Description: 更新单个列 .Update
//	http://localhost:8888/user/edit01?id=19&username=tom1900

// 根据条件更新
//db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

// User 的 ID 是 `111`
//db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;

// 根据条件和 model 的值进行更新
//db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;

// @receiver u
// @param c
func (u UserController) Edit01(c *gin.Context) {
	param := myModel.User{}
	err := c.ShouldBind(&param) //[结构体必须使用 `form:"xxx"`]
	if err != nil {
		c.JSON(http.StatusOK, myModel.Fail("参数错误"))
		return
	}
	id := param.Id
	username := param.Username
	var user myModel.User
	myModel.Db.Model(&user).Where("id = ?", id).Update("username", username)
	c.JSON(http.StatusOK, myModel.Success("修改成功", nil))
}

// Edit02
//
//	@Description: 更新多列  .Updates
//	http://localhost:8888/user/edit02?id=19&username=tom1901&age=19

// 根据 `struct` 更新属性，只会更新非零值的字段
//db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

// 根据 `map` 更新属性，可以更新零值
//db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

// Edit02 @receiver u
// @param c
func (u UserController) Edit02(c *gin.Context) {
	param := myModel.User{}
	err := c.ShouldBind(&param) //[结构体必须使用 `form:"xxx"`]
	if err != nil {
		c.JSON(http.StatusOK, myModel.Fail("参数错误"))
		return
	}
	id := param.Id
	username := param.Username
	age := param.Age
	var user myModel.User
	myModel.Db.Model(&user).Where("id = ?", id).Updates(map[string]interface{}{"username": username, "age": age})
	c.JSON(http.StatusOK, myModel.Success("修改成功", nil))
}
